/**
 * Copyright (C), 2001-2031, www.bosssof.com.cn
 * FileName: RoleApi.java
 * Author: chen
 * Date: 2024/6/1 16:39
 * Description:
 * 定义了角色的管理接口，包括 角色增删改查 以及
 * 角色分配资源  用户分配  查询该角色拥有的资源
 * History:
 * Date          Author   Version  Desc
 * 2024-01-01    bosssoft  1.0.0   initialize this file
 */
package com.bosssoft.g1.api;

import com.bosssoft.g1.common.data.vo.CommonResponse;
import com.bosssoft.g1.dto.*;
import com.bosssoft.g1.group.CreateGroup;
import com.bosssoft.g1.group.UpdateGroup;
import com.bosssoft.g1.query.UserRoleQuery;
import com.bosssoft.g1.entity.Node;
import com.bosssoft.g1.vo.CompanyVO;
import com.bosssoft.g1.vo.RoleVO;
import com.bosssoft.g1.vo.UserVO;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.*;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @className: RoleApi
 * @description: RoleController层接口
 * 主要方法为 角色分配资源（assignResourcesToRole）和角色分配用户（assignUserToRole）
 * 其他方法较为常规主要是针对角色的增删改查
 * @author: chen
 * @date: 2024/6/1 16:39
 * @since 1.0
 **/
@CrossOrigin
@Validated
@Api(value = "/v1/role", tags = "角色管理")
@RequestMapping("/v1/role")
public interface RoleApi {
    /**
     * 开始时获取所有用户信息，页面加载
     * 统一查询角色信息——显示在状态框内,分页，【测试成功】
     * @param:  pageDTO
     * @return: CommonResponse
     */
    @ApiOperation( value = "查询角色")
    @GetMapping( "/all")
    @ResponseBody
    CommonResponse<PageInfo<RoleVO>> getAllRoles(PageDTO pageDTO);

    /**
     * 增加角色——增加按钮
     * @param: 角色DTO
     * @return: CommonResponse
     */
    @ApiOperation(value = "增加角色")
    @PostMapping("/add")
    @ResponseBody
    CommonResponse<Boolean> addRole(@NotNull @Validated(CreateGroup.class)  @RequestBody RoleDTO roleDTO);

    /**
     * 通过id删除一个角色——单选，删除按钮，【测试成功】
     * @param id)
     * @return CommonResponse
     */
    @ApiOperation("删除一个角色")
    @DeleteMapping("/deleteOne")
    @ResponseBody
    CommonResponse<Boolean> deleteRoleById(@NotNull @RequestParam("id") Long id);

    /**
     * 批量删除角色信息——多选，删除按钮,【测试成功】
     * @param roleDTO
     * @return CommonResponse
     */
    @ApiOperation("批量删除角色")
    @DeleteMapping("/delete")
    @ResponseBody
    CommonResponse<Boolean> batchDeleteRole(@NotEmpty @Valid @RequestBody List<RoleDTO> roleDTO);


    /**
     * 通过id查询一个角色信息——单选，查询按钮，【测试成功】
     * @param id
     * @return CommonResponse
     */
    @ApiOperation("查询一个角色")
    @PostMapping( "/query/{id}")
    @ResponseBody
    CommonResponse<RoleDTO> queryRoleById( @PathVariable("id") Long id);

    /**
     * 通过角色名查询角色信息——查询按钮
     * @param name
     * @return CommonResponse
     */
    @ApiOperation("通过角色名查询角色信息")
    @GetMapping("/query")
    @ResponseBody
    CommonResponse<PageInfo<RoleVO>> queryRoles(@RequestParam("pageSize") int pageSize,
                                                @RequestParam("pageNum") int pageNum,
                                                @RequestParam(value = "name", required = false) String name);

    /**
     * 通过id修改角色信息——编辑按钮，【测试成功】
     * 弹出框显示信息时调用 查询单个角色信息 queryRoleById
     * 保存后新增角色9999
     * @param roleDTO
     * @return CommonResponse
     */
    @ApiOperation("编辑角色信息")
    @PutMapping("/edit")
    @ResponseBody
    CommonResponse<Boolean> updateRole(@NotNull @Validated(UpdateGroup.class) @RequestBody RoleDTO roleDTO);

    /**
     * 复制角色弹出修改框，操作保存后新增角色信息——复制按钮
     * @param roleDTO
     * @return CommonResponse
     *//*
    @ApiOperation("复制角色信息并弹出修改，保存后新增角色信息")
    @PostMapping("")
    @ResponseBody
    CommonResponse copyRole(@NotNull @RequestBody RoleDTO roleDTO);*/

    /**
     * 通过角色id查看权限1
     * 弹出框显示子系统（角色id查看到的资源树）——查看权限按钮，【测试成功】
     * @param id
     * @return
     * CommonResponse
     */
    @ApiOperation("角色查看权限1 显示角色子系统资源")
    @GetMapping("/queryRoleSource")
    @ResponseBody
    CommonResponse<List<Node>> queryRoleResourceByRoId(@RequestParam("id") Long id);

    /**
     * 通过角色id查看权限2
     * 角色所属公司——查看权限按钮，【测试成功】
     * @param id
     * @return CommonResponse
     */
    @ApiOperation("角色查看权限2 显示角色所属公司")
    @GetMapping("/queryRoleCompany")
    @ResponseBody
    CommonResponse<List<CompanyVO>> queryRoleCompanyByRoId(@RequestParam("id") Long id);

    /**
     * 用户分配1——用户分配按钮，【测试成功】
     * 显示用户工号 用户名 公司 部门 信息
     * @param pageDTO
     * @return*/
    @ApiOperation("用户分配1 显示用户部分信息")
    @GetMapping("/queryUser")
    CommonResponse<PageInfo<UserVO>> queryUser(@NotNull @Valid PageDTO pageDTO);

    /**
     * 用户分配2——用户分配按钮
     * 将角色分配给多个用户
     * @param userRoleDTO
     * @return
     */
    @ApiOperation("用户分配2 进行分配")
    @PostMapping("/assignUserToRole")
    @ResponseBody
    CommonResponse<Boolean> assignUserToRole(@NotNull @RequestBody @Valid UserRoleDTO userRoleDTO);

    /**
     * 通过角色用户id得到资源树
     * 弹出框显示子系统（用户id查到的资源树）——资源分配按钮
     * 返回id name数据
     * @param userRoleQuery
     * @return
     * CommonResponse
     */
    @ApiOperation("角色资源分配1 显示用户子系统资源")
    @PostMapping("/queryUserResource")
    @ResponseBody
    CommonResponse<List<Node>> queryUserResourceByRole(@NotNull @Valid @RequestBody UserRoleQuery userRoleQuery);

    /**
     * 显示公司——资源分配按钮
     * @return
     */
    @ApiOperation("角色资源分配2 显示公司")
    @GetMapping("/queryCompany")
    @ResponseBody
    CommonResponse<List<CompanyVO>> queryCompanys();

    /**
     * 资源分配3——分配资源
     * @param roleResourceDTO
     * @return
     */
    @ApiOperation("角色资源分配3 进行分配")
    @PostMapping("/assignResourceToRole")
    @ResponseBody
    CommonResponse<Boolean> assignResourceToRole(@NotNull @Valid @RequestBody RoleResourceDTO roleResourceDTO);

    /**
     * 资源分配4——分配公司
     * @param roleCompanyDTO
     * @return
     */
    @ApiOperation("角色资源分配4 进行分配")
    @PostMapping("/assignCompanyToRole")
    @ResponseBody
    CommonResponse<Boolean> assignCompanyToRole(@NotNull @Valid @RequestBody RoleCompanyDTO roleCompanyDTO);


}
